讨厌死权限题了,然而这题又是 $bzoj$ 的权限题。
$QwQ$ 只好去洛谷上做了,幸好洛谷收的题目比较多。
这题就是网络流,我们先假设棋盘上摆满了士兵,这个时候需要拿走一些士兵,使得棋盘仍然是合法的,求拿走的最多数。
额……最多数让我想起了最大流,不过现在还是先来考虑怎么建图。
我们建两排点,第一排表示行,一共 $M$ 个点,第二排表示列,一共 $N$ 个点。对于一个点 $(x,y)$ ,就像从第一排的第 $x$ 号点向第二排的第 $y$ 号点连一条边权为 $1$ 的边。
这个显然是没有问题的。
然后就是限制,对于第 $k$ 行,至少要有 $L_k$ 个士兵,于是我们从 $s$ 连一条边权为 $L_k$ 的边,连向第一排的第 $k$ 号点。同样的道理,对于第二排的点,我们也像这样连边,连向
$t$ 。
然后就是跑 $dinic$ 了,别忘了跑出来的不是答案,而是最多拿走的士兵数,这个时候用整个棋盘的空位置的个数减去跑出来的 $maxflow$ 才是答案。
需要注意几个点:
当我们在看到了一个行/列的时候,需要判断一下。假设这个是行,那么这行的位置显然有 $n$ 个,如果 $n$ 减去这行障碍的个数,再减去最少要放的士兵数后为负数,那么显然就怎么也不可能有合法的方案,于是直接输出 “JIONG” 就好了。
注意整个棋盘的空位置不是 $N\cdot M$ ,而是 $N\cdot M-K$!
- 数组大小的话只需要开到 $2n$ ,并不需要开到 $n^2$ ,因为只有两排点。但是边的数组大小需要开到 $n^2$ ,因为我们对于棋盘上的一个点就要连一条边表示它!
Code:
1 |
|
文章作者:Qiuly
发布时间:2019年03月01日 - 00:00
最后更新:2019年03月29日 - 13:55
原始链接:http://qiulyblog.github.io/2019/03/01/[题解]luoguP4311/
许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。